package thread;

/**
 * 互斥锁,
 * 当使用多个synchronized锁定多个代码片段,并且指定的同步监视器对象是同一个时,
 * 那么这些代码片段之间就是互斥的,多个线程不能同时执行他们
 */
public class SyncDemo4 {
    public static void main(String[] args) {
        Boo b = new Boo();
        Thread t1 = new Thread(){
            @Override
            public void run() {
                b.methodA();
            }
        };

        Thread t2 = new Thread(){
            @Override
            public void run() {
                b.methodB();
            }
        };
        t1.start();
        t2.start();
    }
}
class Boo{
    public synchronized void methodA(){
        try {
            Thread t = Thread.currentThread();
            System.out.println(t.getName() + "正在执行A方法");
            Thread.sleep(5000);
            System.out.println("A方法执行完毕");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void methodB(){//该写法会出现互斥现象
        /*
            public void methodB(){
                synchronized (this) {}
             }
             该方法会出现互斥现象,因为块内的参数是this当前对象,再调用时走的都是同一个对象
         */
        /*
            public void methodB(){
                synchronized ("this") {}
            }
            该方法不会出现互斥现象,因为块内的参数是字符串而不是当前对象
        */
            try {
                Thread t = Thread.currentThread();
                System.out.println(t.getName() + "正在执行B方法");
                Thread.sleep(5000);
                System.out.println("B方法执行完毕");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

    }
}
